#include "BonusPacmanPersigueALosFantasmas.h"

#include "IteradorLista.h"
#include "Pacman.h"
#include "Fantasma.h"
#include "EscenarioModelo.h"
#include "EstrategiaMovimientoHuir.h"
#include "EstrategiaMovimientoPersegir.h"
#include "Juego.h"

BonusPacmanPersigueALosFantasmas::BonusPacmanPersigueALosFantasmas(Punto* unPunto,unsigned int unRadio, bool vivo) : BonusModel(unPunto,unRadio,vivo){

}

BonusPacmanPersigueALosFantasmas::~BonusPacmanPersigueALosFantasmas(){
    
}

void BonusPacmanPersigueALosFantasmas::colisionarConPacman(ObjetoVivo* unObjetoVivo){
    Pacman* elPacman = (Pacman*)unObjetoVivo;
    Lista<Fantasma>* fantasmas = NULL;

	/*if(elPacman->equals(EscenarioModelo::getEscenario()->getPacmanJugador1())){        
        fantasmas = (Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador1();   
    }else{
        fantasmas = (Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador2();
    }*/

    elPacman->setEstaSiendoCasado(false);

	this->invertirPerseguido((Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador1(),elPacman);
	this->invertirPerseguido((Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador2(),elPacman);
	
	this->matar();
    
    
    }

void BonusPacmanPersigueALosFantasmas::invertirPerseguido(Lista<Fantasma>* listaFantasmas, Pacman* elPacman){
	IteradorLista<Fantasma> it = listaFantasmas->iterador();
    while(it.tieneSiguiente()){

        Fantasma* f = it.siguiente();
		// Van a huir si: 
		//	NO estan volviendo a la cueva
		//  NO estan en la cueva
		//	El fantasma en ese momento esta siguiendo a ese pacman.
        if(!f->getEstrategiaMovimiento()->esEstrategiaVolverACueva() && 
			!f->getEstrategiaMovimiento()->esEstrategiaEstarEnCueva() &&
			f->getPresa()->equals(elPacman)){
            unsigned short velocidad = f->getEstrategiaMovimiento()->getVelocidadOriginal();
            delete f->getEstrategiaMovimiento();
            EstrategiaMovimientoHuir* est = new EstrategiaMovimientoHuir(elPacman,velocidad);
            f->setEstrategiaMovimiento(est);
			f->setEstaSiendoCazado(true);

            Uint32* argumentos = new Uint32[2];
            memcpy(&argumentos[0],&(this->duracionEfecto),sizeof(Uint32));
            memcpy(&argumentos[1],&f,sizeof(Uint32));
            SDL_Thread* thread = SDL_CreateThread(BonusPacmanPersigueALosFantasmas::volverAEstrategiaPerseguirThread, argumentos);
            
			// Se agrega el thread a la lista de thread para luego terminarlo si queda vivo.
			Juego::listaThreads->agregar(thread);
		}
    }
}

void BonusPacmanPersigueALosFantasmas::colisionarConFantasma(ObjetoVivo* unObjetoVivo){
    
    }


int BonusPacmanPersigueALosFantasmas::volverAEstrategiaPerseguirThread(void* parametros){
        Uint32* arregloParametros = (Uint32*)parametros;

        Uint32 delay = (Uint32)arregloParametros[0];
        Fantasma* f = (Fantasma*)arregloParametros[1];

        SDL_Delay(delay);

        f->getPresaOriginal()->setEstaSiendoCasado(true);
     
        if(!f->getEstrategiaMovimiento()->esEstrategiaVolverACueva() && !f->getEstrategiaMovimiento()->esEstrategiaEstarEnCueva()){
		    
            unsigned short velocidad = f->getEstrategiaMovimiento()->getVelocidadOriginal();
            delete f->getEstrategiaMovimiento();
			
			//f->setEstrategiaMovimiento(new EstrategiaMovimientoPersegir(f->getPresaOriginal(),velocidad));
			f->setEstrategiaMovimiento(new EstrategiaMovimientoPersegir(f->getPresa(),velocidad));
			f->setEstaSiendoCazado(false);
        }
		delete[] arregloParametros ;
        
        return 0;
}
